package model

type SysRoleMenu struct {
	RoleId int `json:"roleId" gorm:"primarykey;comment:权限ID;not null"` // 权限ID
	MenuId int `json:"menuId" gorm:"primarykey;comment:菜单ID;not null"` // 菜单ID
}

type SysMenu struct {
	MenuId    string `json:"menuId" gorm:"primarykey;comment:菜单ID;autoIncrement"` // 菜单Id
	MenuName  string `json:"menuName" gorm:"comment:菜单名称" validate:"required"`    // 菜单名称
	ParentId  string `json:"parentId" gorm:"comment:父菜单ID"`                       // 父菜单ID
	OrderNum  int    `json:"orderNum" gorm:"comment:显示顺序" validate:"required"`    // 显示顺序
	Path      string `json:"path" gorm:"comment:路由地址"`                            // 路由地址
	Component string `json:"component" gorm:"comment:组件路径"`                       // 组件路径
	IsFrame   int8   `json:"isFrame" gorm:"comment:是否为外链（0是 1否）"`                 // 是否为外链（0是 1否）
	IsCache   int8   `json:"isCache" gorm:"comment:是否缓存（0缓存 1不缓存）"`               // 是否缓存（0缓存 1不缓存）
	MenuType  string `json:"menuType" gorm:"comment:菜单类型（M目录 C菜单 F按钮）"`           // 菜单类型（M目录 C菜单 F按钮）
	Visible   string `json:"visible" gorm:"comment:菜单状态（0显示 1隐藏）"`                // 是否显示（0显示 1隐藏）
	Status    string `json:"status" gorm:"comment:菜单状态（0正常 1停用）"`                 // 菜单状态（0正常 1停用）
	Perms     string `json:"perms" gorm:"comment:权限标识"`                           // 权限标识
	ReqPath   string `json:"reqPath" gorm:"comment:请求路径"`                         // 请求路径
	Icon      string `json:"icon" gorm:"comment:菜单图标"`                            // 菜单图标
	Children  Menus  `json:"children" gorm:"-"`
	Operate
}

// 判断是否根节点
func (menu SysMenu) IsRoot() bool {
	return menu.ParentId == "00"
}

// 寻找父级节点
func (menu SysMenu) HasParent(list []SysMenu, index int) bool {
	for i := 0; i < len(list); i++ {
		if i != index && menu.ParentId == list[i].MenuId {
			return true
		}
	}

	return false
}

type Menus []SysMenu

func (m Menus) Len() int           { return len(m) }
func (m Menus) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
func (m Menus) Less(i, j int) bool { return m[i].OrderNum < m[j].OrderNum }

// 根据根节点递归寻找子节点
func (m Menus) SyntheticTree(list []SysMenu) {
	for i := 0; i < len(m); i++ {
		m := &m[i]
		for _, v := range list {
			if m.MenuId == v.ParentId {
				m.Children = append(m.Children, v)
			}
		}
		m.Children.SyntheticTree(list)
	}
}

// 构建根节点树
func (m Menus) GetRootTree() (children Menus) {
	for index, v := range m {
		if v.IsRoot() || !v.HasParent(m, index) {
			children = append(children, v)
		}
	}
	return children
}
